"use strict";
// 静态成员分为静态方法和静态属性
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
    if (kind === "m") throw new TypeError("Private method is not writable");
    if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
    if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
    return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
    if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
    if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
    return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var _a, _Cars_others;
// 静态方法和静态属性不能用this调用，只能通过类名.调用
class Car {
    constructor(name, price, other) {
        this.name = name;
        this.price = price;
        Car.others = other;
        this.nihao();
    }
    static sayhellow() {
        console.log("hellow");
    }
    nihao() {
        console.log("你好");
    }
}
const bmw = new Car("bmw", 10, { chaiel: "徐州" });
console.log(bmw.name);
// console.log(bmw.others);//报错
console.log(Car.others);
Car.sayhellow();
// bmw.sayhellow()//报错
// 静态代码块
// 静态成员分为静态方法和静态属性
// 静态方法和静态属性不能用this调用，只能通过类名.调用
class Cars {
    constructor(name, price, other) {
        this.name = name;
        this.price = price;
        __classPrivateFieldSet(_a, _a, other, "f", _Cars_others);
    }
    nihao() {
        console.log("你好");
        console.log(__classPrivateFieldGet(_a, _a, "f", _Cars_others));
    }
}
_a = Cars;
_Cars_others = { value: void 0 }; //这行代码定义了一个 私有的静态字段。这种语法是 ECMAScript 的私有字段语法，前面带 # 表示该字段只能在类的内部使用。
(() => {
    console.log(22);
    try {
        let lastlength = {
            length: 10,
        };
        __classPrivateFieldSet(_a, _a, lastlength.length, "f", _Cars_others);
    }
    catch (_b) {
    }
})();
// console.log(Cars.#others);//不能再类外访问 只
const bmws = new Cars("bmw", 10, { chaiel: "静态区块" });
bmws.nihao();
// 这是 ES2022 标准中定义的 私有实例字段，特点：
//
// 特性	            说明
// 使用 # 开头	   表示该字段是私有的
// 只能在类内部访问	外部访问将直接抛出语法错误（编译阶段）
// 每个实例独立	   和普通实例字段一样，每个对象有自己的一份
// 非静态字段	      不属于类本身，而是属于类的每个实例
// 是运行时私有的	   和 TypeScript 的 private 不同，它在运行时也是隐藏的
//
// 二、和 TypeScript 的 private 区别
// 项目	       TypeScript 的 private	   ES 的 #字段
// 是否运行时隐藏	❌ 否（运行时还是能访问）	✅ 是
// 是否是真正的私有	❌ 编译私有	✅ 原生私有
// 外部访问会报错	⭕ 报类型错误（TS 检查）	✅ 报语法错误
// 浏览器支持情况	编译后兼容好	需要支持私有字段语法的浏览器
// 可否用于静态字段	✅ 支持 private static	✅ 支持 static #字段
// 2. TypeScript private（编译隐藏）：
// class Car {
//     private secret = "123";
// }
// const c = new Car();
// console.log(c.secret); // ❌ TS 报错，但 JS 编译后其实还是能访问到
// 3. ES 原生私有字段 #secret：
// class Car {
//     #secret = "456";
//     getSecret() {
//         return this.#secret;
//     }
// }
// const c = new Car();
// console.log(c.getSecret()); // ✅ "456"
// console.log(c.#secret);     // ❌ SyntaxError: Private field '#secret' must be declared
